Building a node.js app with typescript

개요

In this post, you will learn how to deploy a node.js server in a typescript environment.

기본적인 서버 및 데이터베이스의 구축에서 부터 실제 배포 및 개발환경 세팅에 이르는 실제 운영을 위한 여러 고려사항들을 검토하고 논의하며 ubuntu 운영체제를 기본 환경으로 사용한다.

Installation

At first, install node.js web server

먼저 홈페이지에 들어가서 노드js를 설치한다.
nodejs 홈페이지

nodejs를 설치했다면 apt-get의 로컬 패키지를 업데이트 해준다.

1
sudo apt-get update

리눅스계열 os의 경우 다음 code로 설치한다.
npm의 경우 원래는 nodejs 안에 포함되어 같이 깔리지만 커맨드가 안잡힌다면 아래 별도 명령어를 통해 다시 설치해 준다.

1
2
sudo apt-get install -y nodejs
sudo apt-get npm

cmd에서 node –version으로 설치가 잘 되었는지 확인하고 npm을 통해 다양한 모듈을 세팅한다.
만약 aws 서버의 경우 보안 문제 때문에 제대로 설치가 되지 않을 수 있다.
그럴때는 –unsafe-perm 을 붙여 설치를 진행해 본다.
대부분의 문제가 해결될 것이다.

npm의 버전이 맞지 않아 패키지 설치에 문제가 있는 경우 npm을 최신버전으로 업데이트 해야 한다.
하지만, npm을 업데이트 하기 전에 그에 상응하는 최신 nodejs를 설치해 주기 위해 nodejs 버전관리 모듈인 n을 설치해 주고 새로운 nodejs를 설치해 준다.

1
2
sudo npm install n -g
sudo n stable

설치가 완료된 뒤에 다음 명령어를 입력하여 제대로 버전이 바뀌었는지를 확인한다.

1
node -v

여기서 버전이 제대로 업데이트 되지 않았다면 다음과 같이 수동으로 입력해 준다.

1
sudo ln -sf /usr/local/n/versions/node/6.0.0/bin/node /usr/bin/node

npm을 최신으로 업데이트 해 준다.

1
sudo npm install npm@latest -g

shell을 재실행 시킨 뒤 npm의 버전이 변경되었는지 확인한다.

1
npm -v

Compile Typescript

typescript 컴파일러인 tsc 를 통해 다음과 같이 컴파일 할 수 있다.

1
tsc

typescript compile 할 때에 필요한 다양한 옵션을 tsconfig.json 파일에 명실 할 수 있다. 필자의 경우는 file import 시에 다음과 같이 alias 를 사용하였기 때문에 해당 alias 의 위치를 tsc 가 찾을 수 있도록 tsconfig.json 에 paths를 등록해 준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"sourceMap": true,
"allowSyntheticDefaultImports": true,
"allowJs": true,
"outDir": "./dist/",
"noImplicitAny": false,
"lib": ["es2015"],
"esModuleInterop": true,
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"baseUrl": "./src",
"paths": {
"@domain/*": ["server/domain/*"],
"@common/*": ["server/common/*"],
"@utils/*": ["server/utils/*"],
"@infra/*": ["server/infra/*"],
"@api/*": ["server/api/*"],
"@interfaces/*": ["server/interfaces/*"]
}
},
"include": ["./src/**/*"],
"exclude": ["node_modules", "**/*.spec.ts"]
}

이처럼 path의 경우 단지 컴파일러에게 해당 파일이 어디에 있는지에 대한 위치정보만을 가르쳐줄 뿐이며, 이는 컴파일되어도 alias의 값이 그대로 들어가게 된다.

이러한 module-alias 를 실행하기 위해서는 다음과 같이 module-alias 를 설치하고 메인 파일에서 이를 등록해 주어야 한다.

1
npm install --save module-alias

index.ts

1
require('module-alias/register');

이러한 alias의 위치를 실행시점에서 지정해 주어야 하며, 그는 package.json 파일에 다음과 같이 지정해 주어야 node 엔진이 해당 파일을 찾아서 실행이 가능하다.

package.json

1
2
3
4
5
6
7
8
9
10
11
12
{
"_moduleAliases": {
"@domain": "dist/domain",
"@infra": "dist/infra",
"@util": "dist/util",
"@common": "dist/common",
"@interfaces": "dist/interfaces",
"@utils": "dist/utils",
"@api": "dist/api",
"@root": "dist"
}
}

Paths 뿐만 아니라 컴파일 시에 타겟 언어를 지정하고, 모듈관리, 소스맵 등의 다양한 옵션을 설정해 준다.

How to manage environment variables

서버를 운용함에 있어 개발 환경과 실제 운영서버에 따라 달라지는 다양한 환경변수들을 관리하는 것은 보안 및 시스템의 관리 측면에서 매우 중요하다.

본 프로젝트에서는 docker container 기술을 사용하여 운영서버를 배포하며, 개발 서버의 경우 로컬 머신을 사용한다.

여기서 운영서버의 경우 docker image 를 생성하는 시점에서 사용되는 Dockerfile 에 운영시에 사용되는 environment variable 을 저장

서버를 여러 배포환경에서 배포하기 위해 dotenv 라이브러리를 사용하여 .env 파일 내의 환경 변수를 프로세스 환경변수로 사용할 수 있다.

여기서 만약 .env 파일 내의 변수가 기존의 환경 변수와 충돌이 난다면 .env 파일에서 설정한 변수는 무시된다.

npm 시작하기 머신러닝강의 4강 - multinomial classification

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×